package cc.picc.quota;

import java.util.Optional;
import java.util.function.Consumer;

/**
 * <pre>
 * 令牌桶容器。令牌桶容器是个不可变对象。
 * 容器中桶的名称、大小都在初始化时确定，一旦初始化就不能再添加新的桶或变更桶的大小。
 * 
 * </pre>
 * 
 * @author lijinting01
 *
 * @param <T>
 *            QuotaBucket的类型
 * @param <E>
 *            QuotaBucket中的quota类型
 */
public interface QuotaBucketContainer<T extends QuotaBucket<E>, E> {

	/**
	 * 根据名称获取一个bucket
	 * 
	 * @param name
	 *            bucket名称
	 * @return {@link Optional&lt;T&gt;}
	 */
	Optional<T> get(String name);

	/**
	 * 根据名称获取一个bucket
	 * 
	 * @param name
	 *            bucket名称
	 * @param ifPresentConsumer
	 *            如果桶存在则执行该consumer
	 */
	void get(String name, Consumer<T> ifPresentConsumer);

	/**
	 * 从指定名称的桶中弹出一个quota
	 * 
	 * @param name
	 *            桶名称
	 * @return 令牌元素
	 */
	Optional<E> popQuota(String name);

	/**
	 * 从指定名称的桶中弹出一个quota
	 * 
	 * @param name
	 *            桶的名称
	 * @param ifPresentConsumer
	 *            如果元素不为空则执行consumer
	 */
	void popQuota(String name, Consumer<E> ifPresentConsumer);
}
